/**
 * @FilePath     : /src/lgmg_robots/agv_navigation/agv_navigate/include/agvNavigate/helpInc/report_run_data.h
 * @Description  : 定义了ReportRunData类及其相关数据结构RunPathProperty，用于管理和报告AGV的运行路径数据。 
 *                 包括路径属性的设置和获取、导航模式的设置，以及与ROS（机器人操作系统）节点的交互。 
 * @Author       : xiujun.yang
 * @Version      : 1.0.0
 * @LastEditors  : haibo haibo.yang@lgmgim.cn
 * @LastEditTime : 2024-12-19 16:52:32
 * @Copyright (c) 2024 by 临工智能信息科技有限公司, All Rights Reserved. 
**/ 
#pragma once

#include "z_types.h"
#include "tools.h"
#include "rclcpp/rclcpp.hpp"
#include <agv_msgs/msg/laser_obstacle.hpp>
#include <agv_srvs/srv/set_navigation_mode.hpp>
#include <boost/thread/thread.hpp>
#include <mutex>

struct RunPathProperty {
    uint16_t bits;         // 位标志
    int word1;             // 字1
    int word2;             // 字2
    int path_word1;        // 路径字1
    int path_word2;        // 路径字2
    std::string scenes;    // 场景信息

    RunPathProperty() {
        Clear();
    }

    void Clear() {
        bits = 0;
        word1 = -1;
        word2 = -1;
        path_word1 = -1;
        path_word2 = -1;
        scenes = "0";
    }
};

// External notification
//////////////////////////////////////////////////////////////////////////////
//   The interface of class "ReportRunData".
class ReportRunData {
public:
    ReportRunData();
    ~ReportRunData();

    void SetAreaCycle();
    bool Init();
    bool SetAutoMode(bool enable);
    void SetCurGuideMode(USHORT mode);
    void SetCurTrajType(int type);
    RunPathProperty GetPathProperty();
    void SetPathBitsProperty(const uint16_t& bits);
    void SetPathPointWordsProperty(const int& word1, const int& word2);
    void SetPathWordsProperty(const int& word1, const int& word2);
    void SetPathScenesProperty(const std::string& scenes);
    void Clear();

private:
    void InitGuideTypeValue();
    bool ClientSetGuideType();
    void InitTrajTypeValue();
    bool ClientSetTrajType();

    // 轨迹类型枚举
    enum TypeTraj {
        Traj_Unknown = -1,
        Traj_Line = 0,
        Traj_Bezier = 1,
        Traj_Side = 2,
        Traj_Spin = 3
    };

    uint16_t bits_;                 // 位标志
    std::shared_ptr<boost::thread> worker_thread_; // 工作线程
    std::timed_mutex quit_mutex_;   // 退出互斥锁
    bool initialized_;              // 初始化标志
    bool auto_mode_;                // 自动模式标志
    RunPathProperty path_data_;     // 路径数据
    bool update_guide_mode_;        // 导航模式切换标志
    int current_guide_mode_;
    bool update_traj_type_;         // 二维码导航时，直线或自旋标志
    int current_traj_type_;
};
